#pragma once

#include <functional>

#include "noncopyable.h"
#include "Socket.h"
#include "Channel.h"

class EventLoop;
class InetAddress;
/**
 *  工作流程
 * 初始化：
 *  创建非阻塞套接字。
 * 绑定到指定的本地地址和端口。
 * 注册读事件回调函数 handleRead。
 * 监听端口：
 * 调用 listen()，开始监听新连接。
 * 将 acceptSocket_ 的读事件注册到事件循环中。
 * 接受新连接：
 * 当有新连接时，handleRead 被调用。
 * 调用 accept() 获取新连接的文件描述符和客户端地址。
 * 调用用户定义的回调函数，将新连接的信息传递给上层逻辑。
 * 回调处理：
 * 用户定义的回调函数负责处理新连接，例如：
 * 创建新的 TcpConnection。
 * 将新连接分配到子线程的事件循环中。
 */
class Acceptor : noncopyable
{
public:
    using NewConnectionCallback = std::function<void(int sockfd, const InetAddress &)>;

    Acceptor(EventLoop *loop, const InetAddress &listenAddr, bool reuseport);
    ~Acceptor();
    //设置新连接的回调函数
    void setNewConnectionCallback(const NewConnectionCallback &cb) { NewConnectionCallback_ = cb; }
    // 判断是否在监听
    bool listenning() const { return listenning_; }
    // 监听本地端口
    void listen();

private:
    void handleRead();//处理新用户的连接事件

    EventLoop *loop_; // Acceptor用的就是用户定义的那个baseLoop 也称作mainLoop
    Socket acceptSocket_;//专门用于接收新连接的socket
    Channel acceptChannel_;//专门用于监听新连接的channel
    NewConnectionCallback NewConnectionCallback_;//新连接的回调函数
    bool listenning_;//是否在监听
};